

#include <stdio.h>

void selected();
void maoPao();
void erFen();

int main(int argc, const char * argv[]) {
    
//    xuanZe();
//    maoPao();
    
    
    erFen();
    return 0;
}

// 二分查找
void erFen() {
    // 查找指定的元素
    
    // 前提：这个数据是有序的
    
    int arr[] = {10, 20, 39, 40, 49, 50, 58, 100};
    int len = sizeof(arr) / sizeof(arr[0]);
    
    int min = 0;
    int max = len - 1;
    int mid = len / 2;
    
    int key = 100;
    while (arr[mid] != key) {
        
        if (arr[mid] > key) {// 在左边
            max = mid - 1;
        }else if (arr[mid] < key) {// 在右边
            min = mid + 1;
        }
        mid = (min + max) / 2;
    }
    
    printf("%d\n", mid);
}

// 冒泡排序
void maoPao() {
    
    int arr[] = {333, 3344, 55,5,6,6,7,4,4,23,434,23,4,443,5,5,3324,56,6,2};
    // 计算数组的长度
    int len = sizeof(arr) / sizeof(arr[0]);
    for (int i = 0; i < len-1; i ++) {
        
        // 每轮比较多少次
        // 第 i 轮比较 len-1-i 次
        for (int j = 0; j < len - i -1; j ++) {
            
            if (arr[j] < arr[j+1]) {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
    
    for (int i = 0; i < len; i ++) {
        printf("%d ", arr[i]);
    }
}

/// 选择排序
void xuanZe() {
    // 数组中有len个数据，要比较len-1轮，
    // 应该写一个循环 循环 len-1 次 每循环1次 完成一轮比较
    
    int arr[] = {333, 3344, 55,5,6,6,7,4,4,23,434,23,4,443,5,5,3324,56,6,2};
    int len = sizeof(arr) / sizeof(arr[0]);
    for (int i = 0; i < len-1; i ++) { // 外层循环控制次数
        // 内层循环
        // 拿到下标为 i 的数据 和 后面的数据进行比较
        // i i+1 ... len-1
        //
        for (int j = i+1; j < len; j++) {
            // 比较大小
            // 如果 后面的数据 比 前面的数据 大
            // 交换位置
            if (arr[i] < arr[j]) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
    
    for (int i = 0; i < len; i ++) {
        printf("%d ", arr[i]);
    }
}
